package com.kk.common;

import lombok.Data;

import java.io.Serial;
import java.io.Serializable;

/**
 * @author kl
 * @version 1.0
 * @description: TODO
 * @date 2025/10/14 上午10:10
 */
@Data
public class Result<T> implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    private int code;
    private String msg;
    private T data;

    public Result() {}

    public Result(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 构造方法（使用枚举+数据）
     */
    public Result(IResultCode resultCode, T data) {
        this.code = resultCode.getCode();
        this.msg = resultCode.getMessage();
        this.data = data;
    }

    /**
     * 枚举构造函数
     * @param resultCode
     */
    public Result(IResultCode resultCode) {
        this.code = resultCode.getCode();
        this.msg = resultCode.getMessage();
    }

    /**
     * 失败返回（使用默认失败消息）
     */
    public static <T> Result<T> fail() {
        return new Result<>(ResultCode.FAILED);
    }

    /**
     * 失败返回（自定义消息）
     */
    public static <T> Result<T> fail(String message) {
        return new Result<>(ResultCode.FAILED.getCode(), message, null);
    }

    /**
     * 失败返回（使用状态码枚举）
     */
    public static <T> Result<T> fail(IResultCode resultCode) {
        return new Result<>(resultCode);
    }

    /**
     * 失败返回（自定义状态码+消息）
     */
    public static <T> Result<T> fail(Integer code, String message) {
        return new Result<>(code, message, null);
    }

    /**
     * 失败返回（使用状态码枚举+数据）
     */
    public static <T> Result<T> fail(IResultCode resultCode, T data) {
        return new Result<>(resultCode, data);
    }


    /**
     * 成功返回（无数据）
     */
    public static <T> Result<T> success() {
        return new Result<>(ResultCode.SUCCESS);
    }

    /**
     * 成功返回（带数据）
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(ResultCode.SUCCESS, data);
    }

    /**
     * 成功返回（自定义消息+数据）
     */
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(ResultCode.SUCCESS.getCode(), message, data);
    }
}
